const AiPerson = require("../models/AiPerson");
const Visitor = require("../models/Visitor");
const UserAiConversation = require("../models/UserAiConversation");
const greetingTemplates = require("../data/greetingTemplates");

const languageMap = {
  CN: "zh",
  EN: "en",
  JP: "jp",
};

class AiChatController {
  /**
   * 获取初始问候语
   * @param {Object} req - 请求对象
   * @param {Object} res - 响应对象
   */
  async getInitialGreeting(req, res) {
    try {
      const { uuid, aiPersonId, language } = req.body;

      // 参数验证
      if (!uuid || !aiPersonId || !language) {
        return res.status(400).json({
          success: false,
          message: "缺少必要参数：uuid, aiPersonId, language",
        });
      }

      // 校验language参数，只允许CN, EN, JP
      const validLanguages = ["CN", "EN", "JP"];
      if (!validLanguages.includes(language)) {
        return res.status(400).json({
          success: false,
          message: "language参数无效，必须是: CN, EN, JP 之一",
        });
      }
      // 转换为模板内部使用的语言代码
      const langKey = languageMap[language];

      // 验证访客是否存在
      const visitor = await Visitor.findByPk(uuid);
      if (!visitor) {
        return res.status(404).json({
          success: false,
          message: "访客不存在",
        });
      }

      // 查询AI角色信息
      const aiPerson = await AiPerson.findByPk(aiPersonId);
      if (!aiPerson) {
        return res.status(404).json({
          success: false,
          message: "AI角色不存在",
        });
      }

      // 检查是否已经存在对话记录
      const existingConversation = await UserAiConversation.findOne({
        where: {
          user_uuid: uuid,
          ai_person_id: aiPersonId,
        },
      });

      // 如果已经有对话记录，检查是否有实际的消息内容
      if (existingConversation) {
        const messages = existingConversation.conversation_data?.messages || [];
        // 只有当存在实际消息时，才认为是有效对话
        if (messages.length > 0) {
          return res.status(200).json({
            success: true,
            data: {
              hasConversation: true,
              message: "用户与AI已有对话记录，无需发送问候语",
            },
          });
        }
        // 如果记录存在但没有消息内容，继续执行发送问候语的逻辑
        console.log(`对话记录存在但无消息内容，将发送问候语 - 用户: ${uuid}, AI: ${aiPersonId}`);
      }

      // 获取AI角色的type
      const type = aiPerson.type;
      const validTypes = ["Girl", "AnimeGirl", "Man", "AnimeMan"];
      if (!validTypes.includes(type)) {
        return res.status(400).json({
          success: false,
          message:
            "AI角色类型无效，必须是: Girl, AnimeGirl, Man, AnimeMan 之一",
        });
      }

      // 获取AI角色的第一张图片
      let image = null;
      if (
        aiPerson.images &&
        Array.isArray(aiPerson.images) &&
        aiPerson.images.length > 0
      ) {
        image = aiPerson.images[0];
      } else {
        // 如果没有images数组，尝试使用avatar字段
        image = aiPerson.avatar || null;
      }

      // 获取对应的问候语模板
      const templates =
        greetingTemplates[type] && greetingTemplates[type][langKey];
      if (!templates || !Array.isArray(templates) || templates.length === 0) {
        return res.status(500).json({
          success: false,
          message: "没有找到对应的问候语模板",
        });
      }

      // 随机选择一条问候语
      const randomIndex = Math.floor(Math.random() * templates.length);
      const selectedTemplate = templates[randomIndex];

      // 根据语言选择对应的用户名
      let username;
      // 从information字段中获取name
      if (aiPerson.information && aiPerson.information.name) {
        username = aiPerson.information.name;
      } else {
        // 如果information.name不存在，尝试从旧字段获取（向后兼容）
        switch (langKey) {
          case "zh":
            username = aiPerson.username;
            break;
          case "en":
            username = aiPerson.username_en || aiPerson.username;
            break;
          case "jp":
            username = aiPerson.username_jp || aiPerson.username;
            break;
          default:
            username = aiPerson.username;
        }
      }

      // 如果仍然没有找到名字，使用默认值
      if (!username) {
        username = "AI Assistant";
      }

      // 替换模板中的{name}占位符
      const greetingText = selectedTemplate.replace(/{name}/g, username);

      // 返回结果
      return res.status(200).json({
        success: true,
        data: {
          image: image,
          text: greetingText,
        },
      });
    } catch (error) {
      console.error("获取初始问候语失败:", error);
      return res.status(500).json({
        success: false,
        message: "服务器内部错误",
        error:
          process.env.NODE_ENV === "development" ? error.message : undefined,
      });
    }
  }
}

module.exports = new AiChatController();
